LINE CTF 2021 - Crypto - babycrypto1
TL;DR
問題文
nc 35.200.115.41 16001
概要
AESのCBCモードの問題。
コマンドがtestとshowの2つある。
AESでtoken + b'test'を暗号化した結果が与えられる。
また、IVを指定した上で任意のメッセージを一度だけ復号した結果を得ることが出来る。
その後、任意の暗号文を何回でも復号(CCA2)が可能という設定。 token + b'show'の暗号文を送ればフラグを得られる。
解法
tokenの長さは10ブロック分なので11ブロック目に暗号化したshowを送りたい。
そのためには、得られるtest commandの10ブロック目をivにしてshowを暗号化し、それをtest commandの11ブロック目にすげ替えれば良い。
次のコードはncコマンドと対話的に各変数を埋めながら送信する文字列を出力するもの。
code:py
from base64 import b64decode, b64encode
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad
class AESCipher:
def __init__(self, key):
self.key = key
def encrypt(self, data):
iv = get_random_bytes(AES.block_size)
self.cipher = AES.new(self.key, AES.MODE_CBC, iv)
return b64encode(iv + self.cipher.encrypt(pad(data,
AES.block_size)))
def encrypt_iv(self, data, iv):
self.cipher = AES.new(self.key, AES.MODE_CBC, iv)
return b64encode(iv + self.cipher.encrypt(pad(data,
AES.block_size)))
def decrypt(self, data):
raw = b64decode(data)
test_command = "kbuuTp1iSuv4soT/RS7MNe6VNfi93SaBcPy1LhupUhgoDL8WJ4bM2Yqbq7vag37fB8igMHistB1zZJObM9XtCyCCX+zUbfzJyUNU0bW3p7iWFY/ySQwEQ7rbaoJxKzNCd+EwU6O1TzVNQ6QFnd0n2Anb/Dc0N9wjX6fDlNftw3KCttGZ6M7HBbaYqK1qLg8iwgvA3/C/VIAt1gxdcfhKvjHe+nv5vdpt/OXl3L+wDs+J4zA6roZ+aoyCi247NJNl" # Edit
print(b64encode(iv))
msg = b"show"
print(b64encode(msg))
ciphertext = "Md76e/m92m385eXcv7AOz6fTZTJLKcgGsl47/xl6tg4="
show_command = b64decode(test_command)[
show_command = b64encode(show_command)
print(show_command)
LINECTF{warming_up_crypto_YEAH}